package controller;

import java.rmi.RemoteException;
import java.util.Calendar;
import java.util.List;

import model.Hospedagem;
import model.Hospede;
import model.Hotel;
import dao.DAOHospedagem;
import dao.DAOHospede;
import dao.DAOHotel;


public class HotelController {
	
	public HotelController() throws RemoteException {
		
	}
	
	public Hotel criarHotel(String nome, String gerente, Integer numeroDeQuartos) throws RemoteException {
		Hotel hotel = new Hotel();
		hotel.setNome(nome);
		hotel.setGerente(gerente);
		hotel.criarQuartos(numeroDeQuartos);
		
		DAOHotel daoHotel = new DAOHotel();
		daoHotel.persist(hotel);
		daoHotel.commit();
		
		return daoHotel.findLast();
		
	}
	
	public List<Hotel> getAllHoteis() throws RemoteException {
		DAOHotel daoHotel = new DAOHotel();
		return daoHotel.findAll();
		
	}
	
	public List<Hospede> getAllHospedes(){
		return new DAOHospede().findAll();
	}
	
	public Hotel isDisponivel(int idHotel, int numQuarto, Calendar dataChegada, Calendar dataSaida) {
		DAOHotel daoHotel = new DAOHotel();
		Hotel hotel = daoHotel.findById(idHotel);
		
		DAOHospedagem daoHospedagem = new DAOHospedagem();
		for(Hospedagem h : daoHospedagem.findAllReservas()) {
			if(h.getQuarto() == numQuarto) {
				if((h.getDataInicio().compareTo(dataChegada) == 0) || !(dataChegada.compareTo(h.getDataInicio()) < 0 && dataSaida.compareTo(h.getDataInicio()) <= 0) || !(dataChegada.compareTo(h.getDataInicio()) > 0 && dataChegada.compareTo(h.getDataFim()) >= 0))
					return null;
			}
		}
		
		return hotel;
	}
	
	public Hospedagem registrarReserva(Hotel hotel, Hospede hospede, int numQuarto, Calendar dataChegada, Calendar dataSaida, boolean isReserva) {
		Hospedagem hospedagem = new Hospedagem();
		hospedagem.setHotel(hotel);
		hospedagem.setQuarto(numQuarto);
		hospedagem.setDataInicio(dataChegada);
		hospedagem.setDataFim(dataSaida);
		hospedagem.setReserva(isReserva);
		hospedagem.setHospede(hospede);
		
		if(!isReserva) {
			hotel.getQuarto(numQuarto).setOcupado(true);
			hospede.setHospedagemAtual(hospedagem);
		}
		
		DAOHospedagem daoHospedagem = new DAOHospedagem();
		daoHospedagem.persist(hospedagem);
		daoHospedagem.commit();
		
		return daoHospedagem.findLast();
		
	}
	
	public void encerrarHospedagem(Integer idHospedagem) {
		DAOHospedagem daoHospedagem = new DAOHospedagem();
		Hospedagem hospedagem = null;
		hospedagem = daoHospedagem.findById(idHospedagem);
		hospedagem.setQuitada(true);
		hospedagem.getHotel().getQuarto(hospedagem.getQuarto()).setOcupado(false);
		hospedagem.getHospede().setHospedagemAtual(null);
		hospedagem.getHospede().setUltimaHospedagem(hospedagem);
		daoHospedagem.commit();
	}
	
	public void cancelarReserva(int idHospedagem) {
		DAOHospedagem daoHospedagem = new DAOHospedagem();
		Hospedagem hospedagem = null;
		hospedagem = daoHospedagem.findById(idHospedagem);
		daoHospedagem.remove(hospedagem);
		daoHospedagem.commit();
	}

}
